﻿using System.Collections.Generic;
using System.Linq;
using Contact.Contracts.Common;
using EFDataModel;

namespace Contact.Contracts.Models.Worktime
{
    /// <summary>
    /// Beinhaltet alle Datenzugriffe für die Arbeitszeitverwaltung
    /// </summary>
    public interface IWorktimeSettings : IBaseContracts
    {
        /// <summary>
        /// Ermitteln der Worktimesettings für einen User
        /// </summary>
        /// <param name="userId">UserId für die die Settings herausgesucht werden sollen.</param>
        /// <returns>Ein einzelnes Worktimesetting</returns>
        EFWorktimeSetting LoadWorktimeSetting(long userId);

        /// <summary>
        /// Speichern der Einstellungen
        /// </summary>
        /// <param name="setting">Settings welches gespeichert werden soll.</param>
        /// <returns>TRUE->Speichern erfolgreich | FALSE->Speichern NICHT erfolgreich</returns>
        bool SaveWorktimeSetting(EFWorktimeSetting setting);

        /// <summary>
        /// Anlegen und dann Speichern der Einstellungen
        /// </summary>
        /// <param name="user">Der User für den das Setting gesetzt werden soll</param>
        /// <returns>TRUE->Speichern erfolgreich | FALSE->Speichern NICHT erfolgreich</returns>
        bool AddWorktimeSetting(EFWorktimeSetting setting, EFAuthentication user);

        /// <summary>
        /// Laden der Liste mit den Projekten die dem übergebenen User zugeordnet sind.
        /// </summary>
        /// <param name="userId">UserId zu der alle Projekte herausgesucht werden sollen</param>
        List<EFWorktimeProject> LoadProjects(long userId);

        /// <summary>
        /// Laden der aktiven Projekte
        /// </summary>
        /// <param name="userId">Die UserId für die die aktiven Projekte geladen werden sollen.</param>
        IQueryable<EFWorktimeProject> LoadActiveProjects(long userId);

        /// <summary>
        /// Löschen des übergebenen Projekteintrags
        /// </summary>
        /// <param name="projectId">Der Projekteintrag der entfernt werden soll.</param>
        bool DeleteProject(long projectId);

        /// <summary>
        /// Laden des passenden Projektes anhand der übergebenen ProjektId
        /// </summary>
        /// <param name="projectId">Die ProjektId zu der die Daten geladen werden sollen</param>
        EFWorktimeProject LoadProject(long projectId);

        /// <summary>
        /// Abrufen aller Urlaubszeiteinträge für die übergebene UserId
        /// </summary>
        /// <param name="userId">Der User für den die Urlaubszeiten abgerufen werden sollen.</param>
        List<HolidayDays> LoadHolidays(long userId);

        /// <summary>
        /// Abrufen des passenden Urlaubseintrags
        /// </summary>
        /// <param name="holidayId">den passenden Urlaubseintrag abrufen</param>
        HolidayDays LoadHoliday(long holidayId);

        /// <summary>
        /// Laden des Urlaubszeiteintrags für den User und das angegebene Jahr.
        /// </summary>
        /// <param name="userId">Die UserId für die die Urlaubseinträge gesucht werden sollen </param>
        /// <param name="year">Das Jahr nach dem gesucht werden soll</param>
        HolidayDays LoadHolidayDays(long userId, int year);
        
        /// <summary>
        /// Speichern/Hinzufügen des übergebenen Holidayeintrags in der DB.
        /// </summary>
        /// <param name="holiday">Der Holidayeintrag, der in der DB hinzugefügt werden soll oder gespeichert werden soll.</param>
        /// <param name="userId">die zugehörige UserId zum Holidayeintrag.</param>
        /// <returns>TRUE->Speichern erfolgreich | FALSE->Fehler beim Speichern</returns>
        bool SaveHoliday(HolidayDays holiday, long userId);

        /// <summary>
        /// Speichern/Hinzufügen des übergebenen Projekteintrags in der DB
        /// </summary>
        /// <param name="project">Der Projekteintrag der geändert/erstellt werden soll</param>
        /// <param name="userId">Die zugehörige UserId zum Projekt</param>
        /// <returns>TRUE->Speichern erfolgreich | FALSE->Fehler beim Speichern</returns>
        bool SaveProject(EFWorktimeProject project, long userId);
    }
}
